#include "../head.h"
/*
    线程取消例程函数 是指线程在收到取消请求之后，会执行该函数，然后在响应取消请求
    1.压栈线程的取消例程函数
    void pthread_cleanup_push(void (*routine)(void *),void *arg);
    参数 routine: 线程收到取消请求之后要执行的函数 arg：要传给函数的参数
    2.弹栈线程的取消例程函数
    void pthread_cleanup_pop(int execute);
    execute 为0时，线程如果没有收到取消请求，则不会执行取消例程函数；非0时，则会执行一次
    执行线程取消例程函数之后，原本子线程后面的内容不会执行
    push和pop函数必须成对出现

*/

void routine(void *arg)
{
    printf("接收到取消请求之后,先执行routine函数\n");
}
void *thread_func(void *arg)
{
    pthread_cleanup_push(routine,NULL);
    int i = 0;
    while (i < 15)
    {
        printf("thread_func: %d\n", i++);
        sleep(1);
    }
    printf("子线程结束\n");
    pthread_cleanup_pop(0);
}
int main()
{
    pthread_t thread;

    pthread_create(&thread,NULL,thread_func,NULL);
    for (int i = 0; i < 5; i++)
    {
        printf("main: %d\n", i);
        sleep(1);
    }
    
    pthread_cancel(thread);
    printf("发送取消请求给子线程\n");
    pthread_join(thread,NULL);
    printf("主线程结束\n");
    return 0;
}